﻿--参考文档：http://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html#_Toc9878

--一、记录类型

/*
定义记录类型语法如下:
 
TYPE record_name IS RECORD(
   v1 data_type1  [NOT NULL]  [:= default_value ],
   v2 data_type2  [NOT NULL]  [:= default_value ],
   ......
   vn data_typen  [NOT NULL]  [:= default_value ] );
*/

--例4 ：
 
DECLARE 
   TYPE test_rec IS RECORD(
         Name VARCHAR2(30) NOT NULL := '胡勇',
         Info VARCHAR2(100));
   rec_book test_rec;
BEGIN
   rec_book.Name :='胡勇';
   rec_book.Info :='谈PL/SQL编程;';
   DBMS_OUTPUT.PUT_LINE(rec_book.Name||'  ' ||rec_book.Info);
END;

 
--可以用 SELECT语句对记录变量进行赋值,只要保证记录字段与查询结果列表中的字段相配即可。
 
--例5 ：
 
DECLARE
--定义与hr.employees表中的这几个列相同的记录数据类型
   TYPE RECORD_TYPE_EMPLOYEES IS RECORD(
        f_name   hr.employees.first_name%TYPE,
        h_date   hr.employees.hire_date%TYPE,
        j_id     hr.employees.job_id%TYPE);
--声明一个该记录数据类型的记录变量
   v_emp_record RECORD_TYPE_EMPLOYEES;

BEGIN
   SELECT first_name, hire_date, job_id INTO v_emp_record
   FROM employees
   WHERE employee_id = &emp_id;

   DBMS_OUTPUT.PUT_LINE('雇员名称：'||v_emp_record.f_name
             ||'  雇佣日期：'||v_emp_record.h_date
             ||'  岗位：'||v_emp_record.j_id);
END;

/*
一个记录类型的变量只能保存从数据库中查询出的一行记录，若查询出了多行记录，就会出现错误。
*/


--二、数组类型

/*
数据是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标，它取决于成员在数组中的位置。在PL/SQL中，数组数据类型是VARRAY。
 
定义VARRY数据类型语法如下：
TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];
 
varray_name是VARRAY数据类型的名称，size是下整数，表示可容纳的成员的最大数量，每个成员的数据类型是element_type。默认成员可以取空值，否则需要使用NOT NULL加以限制。对于VARRAY数据类型来说，必须经过三个步骤，分别是：定义、声明、初始化。
*/

--例6 ：
 
DECLARE
--定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
   TYPE reg_varray_type IS VARRAY(5) OF VARCHAR(25);
--声明一个该VARRAY数据类型的变量
   v_reg_varray REG_VARRAY_TYPE;

BEGIN
--用构造函数语法赋予初值
   v_reg_varray := reg_varray_type
         ('中国', '美国', '英国', '日本', '法国');

   DBMS_OUTPUT.PUT_LINE('地区名称：'||v_reg_varray(1)||'、'
                                    ||v_reg_varray(2)||'、'
                                    ||v_reg_varray(3)||'、'
                                    ||v_reg_varray(4));
   DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值：'||v_reg_varray(5));
--用构造函数语法赋予初值后就可以这样对成员赋值
   v_reg_varray(5) := '法国';
   DBMS_OUTPUT.PUT_LINE('第5个成员的值：'||v_reg_varray(5));
END;